package day6.wait_and_notify;

import java.util.concurrent.TimeUnit;
/**
 * wait()和notify()用法
 *   1. 要使用wait和notify, 必须首先对“对象”进行synchronized加锁。
 *   2. wait()过程中是不持有锁的
 */
public class Demo1 {

    static class MyThread extends Thread {

        Object o;
        MyThread(Object o) {
            this.o = o;
        }

        @Override
        public void run() {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (o) {
                System.out.println("唤醒主线程");
                o.notify();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {

        Object o = new Object();

        synchronized (o) {
            // 确保主线程先抢到锁
            MyThread t = new MyThread(o);
            t.start();

            o.wait(); //1.释放o锁；2.等待... 3.再次加锁
            // wait()过程中是不持有锁的，否则代码中的子线程就无法抢到锁去唤醒主线程
        }

        System.out.println("终于被唤醒了！");
    }
}
